//
// Created by Jisam on 2024/6/20.
//
#include <bits/stdc++.h>

using i64 = long long;

using namespace std;
// 数字到其对应的罗马数字或阿拉伯数字的值映射
constexpr int V[] = {0, 1, 2, 3, 4,
                     5, 6, 7, 8, 9,
                     1, 5, 10, 50, 100,
                     500, 1000};
// 无穷大常量，用于初始化动态规划数组
constexpr int inf = 0x3f3f3f3f;

void solve() {
    // 读取待表示的正整数n
    string n;
    cin >> n;

    // 读取阿拉伯数字和罗马数字的代价数组
    array<int, 17> c{}; // c[0-9]对应阿拉伯数字0-9的代价，c[10-16]对应罗马数字I-V-M的代价
    for (int i = 0; i < 17; i++) {
        cin >> c[i];
    }

    // 初始化动态规划数组dp，大小为112，因为最大的罗马数字表示不超过1000*3=3000，转换为十进制不超过4位
    vector<int> dp(112, inf);

    // 当前处理的数值（十进制）
    i64 cur = 0;

    // 遍历字符串n的每一位
    for (auto _: n) {
        // 将字符转换为数字
        int d = _ - '0';

        // 更新当前处理的十进制数值
        cur = cur * 10 + d;

        // 初始化下一阶段的动态规划数组
        vector<int> ndp(112, inf);

        // 遍历当前状态的所有可能
        for (int i = 0; i < 112; i++) {
            // 尝试加上一个新的罗马数字或阿拉伯数字
            for (int j = 0; j < 17; j++) {
                // 计算加入新数字后的状态值r
                int r = i * 10 + d - V[j];

                // 检查r是否合法，并尝试更新ndp数组
                if (0 <= r && r <= 111) {
                    ndp[r] = min(ndp[r], dp[i] + c[j]);
                }
            }
        }

        // 尝试直接使用罗马数字表示当前处理的数值
        for (int j = 0; j < 17; j++) {
            i64 r = cur - V[j];
            if (0 <= r && r <= 111) {
                ndp[r] = min(ndp[r], c[j]);
            }
        }

        // 更新dp数组为当前最优解
        swap(dp, ndp);
    }

    // 输出最小代价
    cout << dp[0] << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
